package com.ppch.zerocodegenerator.generator;

import cn.hutool.core.lang.Dict;
import cn.hutool.setting.yaml.YamlUtil;
import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.GlobalConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.util.Map;

/**
 * Mybatis-flex 代码生成器
 */
public class Codegen {

    /**
     * 要进行代码生成的表名
     */
    private final static String GENERATOR_TABLE_NAME = "chat_history";

    public static void main(String[] args) {
        //使用HuTool工具库读取配置文件中的数据库配置
        Dict dict = YamlUtil.loadByPath("application.yml");
        Map<String,Object> datasourceMap = dict.getByPath("spring.datasource");
        String url = String.valueOf(datasourceMap.get("url"));
        String username = String.valueOf(datasourceMap.get("username"));
        String password = String.valueOf(datasourceMap.get("password"));
        //配置数据源
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        //创建配置内容
        GlobalConfig globalConfig = createGlobalConfig();
        //通过 datasource 和 globalConfig 创建代码生成器
        Generator generator = new Generator(dataSource, globalConfig);
        //生成代码
        generator.generate();
    }

    public static GlobalConfig createGlobalConfig() {
        //创建配置内容
        GlobalConfig globalConfig = new GlobalConfig();

        //设置根包：建议生成到一个临时包内，避免影响其它代码
        globalConfig.getPackageConfig()
                .setBasePackage("com.ppch.zerocodegenerator.temp");

        //设置表前缀和只生成哪些表，setGenerateTable 未配置时，生成所有表
        globalConfig.getStrategyConfig()
                //设置逻辑删除字段
                .setLogicDeleteColumn("isDelete")
                .setGenerateTable(GENERATOR_TABLE_NAME);

        //设置生成 entity 并启用 Lombok
        globalConfig.enableEntity()
                .setWithLombok(true)
                .setJdkVersion(21);

        //设置生成 mapper、mapper.xml、service、serviceImpl、controller
        globalConfig.enableMapper();
        globalConfig.enableMapperXml();
        globalConfig.enableService();
        globalConfig.enableServiceImpl();
        globalConfig.enableController();


        //设置生成的注释
        globalConfig.getJavadocConfig()
                .setAuthor("泡泡茶壶")
                .setSince("2025-10-5");

        //可以单独配置某个列
//        ColumnConfig columnConfig = new ColumnConfig();
//        columnConfig.setColumnName("tenant_id");
//        columnConfig.setLarge(true);
//        columnConfig.setVersion(true);
//        globalConfig.getStrategyConfig()
//                .setColumnConfig("tb_account", columnConfig);

        return globalConfig;
    }
}